home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Die Speccy' 97
/
Die Speccy' 97.iso
/
amiga_system
/
the_aminet
/
util
/
moni
/
msfu_v11.lha
/
MSFU
/
src
/
Trace.e
< prev
Wrap
Text File
|
1995-09-05
|
12KB
|
380 lines
OPT MODULE
->/////////////////////////////////////////////////////////////////////////////
->//////////////////////////////////////////////////////////// MODULE ... /////
->/////////////////////////////////////////////////////////////////////////////
MODULE 'exec/lists' , 'exec/nodes' , 'exec/execbase' , 'exec/libraries'
MODULE 'dos/dos' , 'dos/datetime' , 'dos/rdargs'
MODULE 'tools/minconstructors' , 'tools/file'
MODULE '*SystemFiles'
->/////////////////////////////////////////////////////////////////////////////
->//////////////////////////////////////////////// RAISE ... IF ... = ... /////
->/////////////////////////////////////////////////////////////////////////////
RAISE "MEM" IF String() = NIL ,
"MEM" IF AllocDosObject() = NIL ,
"IO" IF Open() = NIL ,
"IO" IF Fputs() = -1
->/////////////////////////////////////////////////////////////////////////////
->/////////////////////////////////////////////////////// CONST ... = ... /////
->/////////////////////////////////////////////////////////////////////////////
ENUM NAME , OPENED , LASTUSED , VERSION , CHNG , LASTCHANGE , NUMBERFIELDS
ENUM ARG_FD , ARG_NC
ENUM ARG_NAME , ARG_OC , ARG_LU , ARG_VER , ARG_REV , ARG_CHNG , ARG_LC , ARG_LIB , ARG_DEV ,
NUMBER_ARGS
->/////////////////////////////////////////////////////////////////////////////
->//////////////////////////////////////////////////////////// OBJECT ... /////
->/////////////////////////////////////////////////////////////////////////////
EXPORT OBJECT trace
filename : PTR TO CHAR
first_date : PTR TO CHAR
num_checks : LONG
libraries : mlh
devices : mlh
ENDOBJECT
->/////////////////////////////////////////////////////////////////////////////
->/////////////////////////////////////////////////////////// PROC create /////
->/////////////////////////////////////////////////////////////////////////////
PROC create( filename = NIL ) OF trace
self.filename := ( IF filename THEN filename ELSE 'PROGDIR:MSFU.trace' )
self.first_date := current_date()
newminlist( self.libraries )
newminlist( self.devices )
ENDPROC
->/////////////////////////////////////////////////////////////////////////////
->///////////////////////////////////////////////////////////// PROC load /////
->/////////////////////////////////////////////////////////////////////////////
PROC load() OF trace HANDLE
DEF mem = NIL , len
DEF lines : PTR TO LONG , numlines , i = -1 , line[ 200 ] : STRING
DEF rd = NIL : PTR TO rdargs , args = NIL : PTR TO LONG
DEF sf : PTR TO sysfile
mem , len := readfile( self.filename )
lines := stringsinfile( mem , len , numlines := countstrings( mem , len ) )
rd := AllocDosObject( DOS_RDARGS , NIL )
NEW args[ NUMBER_ARGS ]
FOR i := 0 TO ( numlines - 1 )
args[ ARG_LIB ] := FALSE
args[ ARG_DEV ] := FALSE
rd.source.buffer := StrAdd( StrCopy( line , lines[ i ] ) , '\n' )
rd.source.length := EstrLen( line )
rd.source.curchr := 0
rd.dalist := NIL
rd.buffer := NIL
rd.bufsiz := 0
IF i
ReadArgs( 'NAME,OC/N,LU,VER/N,REV/N,CHNG/N,LC,LIB/S,DEV/S' , args , rd )
NEW sf
sf.name := StrCopy( String( StrLen( args[ ARG_NAME ] ) ) , args[ ARG_NAME ] )
sf.open_count := Long( args[ ARG_OC ] )
sf.last_used := StrCopy( String( StrLen( args[ ARG_LU ] ) ) , args[ ARG_LU ] )
sf.vernum := Long( args[ ARG_VER ] )
sf.revnum := Long( args[ ARG_REV ] )
sf.changed := Long( args[ ARG_CHNG ] )
sf.last_change := StrCopy( String( StrLen( args[ ARG_LC ] ) ) , args[ ARG_LC ] )
AddTail( IF args[ ARG_LIB ] THEN self.libraries ELSE self.devices , sf )
ELSE
ReadArgs( 'FD,NC/N' , args , rd )
self.first_date := StrCopy( String( StrLen( args[ ARG_FD ] ) ) , args[ ARG_FD ] )
self.num_checks := Long( args[ ARG_NC ] )
ENDIF
FreeArgs( rd )
ENDFOR
EXCEPT DO
IF ( i >= 0 ) AND ( i <= ( numlines - 1 ) ) THEN FreeArgs( rd )
END args[ NUMBER_ARGS ]
IF rd THEN FreeDosObject( DOS_RDARGS , rd )
IF mem THEN freefile( mem )
IF exception = "MEM"
ReThrow()
ELSEIF ( exception = "OPEN" ) OR ( exception = "IN" )
PrintFault( IoErr() , 'Can''t open trace ' )
ENDIF
ENDPROC
->/////////////////////////////////////////////////////////////////////////////
->///////////////////////////////////////////////////////////// PROC save /////
->/////////////////////////////////////////////////////////////////////////////
PROC save() OF trace HANDLE
DEF file = NIL , sl[ 100 ] : STRING
file := Open( self.filename , NEWFILE )
Fputs( file , StringF( sl , '\s \d\n' , self.first_date , self.num_checks ) )
save_sysfiles( file , self.libraries , 'LIB' )
save_sysfiles( file , self.devices , 'DEV' )
EXCEPT DO
PrintFault( IoErr() , 'Can''t save trace ' )
IF file THEN Close( file )
ENDPROC
->/////////////////////////////////////////////////////////////////////////////
->/////////////////////////////////////////////////////////// PROC update /////
->/////////////////////////////////////////////////////////////////////////////
PROC update( libs , devs ) OF trace
DEF list : mlh , eb : execbase
self.num_checks := self.num_checks + 1
eb := execbase
IF libs
current_sysfiles( list , eb.liblist )
mix_sysfiles( list , self.libraries )
ENDIF
IF devs
current_sysfiles( list , eb.devicelist )
mix_sysfiles( list , self.devices )
ENDIF
ENDPROC
->/////////////////////////////////////////////////////////////////////////////
->///////////////////////////////////////////////////////////// PROC sort /////
->/////////////////////////////////////////////////////////////////////////////
PROC sort() OF trace
sort_sysfiles( self.libraries )
sort_sysfiles( self.devices )
ENDPROC
->/////////////////////////////////////////////////////////////////////////////
->//////////////////////////////////////////////////////////// PROC print /////
->/////////////////////////////////////////////////////////////////////////////
PROC print() OF trace
PrintF( '\n\d check were done since \s.\n' , self.num_checks , self.first_date )
print_sysfiles( self.libraries , 'Library name' , self.num_checks )
print_sysfiles( self.devices , 'Device name' , self.num_checks )
ENDPROC
->/////////////////////////////////////////////////////////////////////////////
->///////////////////////////////////////////////////// PROC current_date /////
->/////////////////////////////////////////////////////////////////////////////
PROC current_date()
DEF dt : datetime
DEF str[ 30 ] : ARRAY
DateStamp( dt.stamp )
dt.format := FORMAT_DOS
dt.flags := 0
dt.strday := NIL
dt.strdate := str
dt.strtime := NIL
DateToStr( dt )
ENDPROC StrCopy( String( StrLen( str ) ) , str )
->/////////////////////////////////////////////////////////////////////////////
->///////////////////////////////////////////////// PROC current_sysfiles /////
->/////////////////////////////////////////////////////////////////////////////
PROC current_sysfiles( list : PTR TO mlh , syslist : PTR TO mlh ) HANDLE
DEF sf : PTR TO lib , f : PTR TO sysfile -> OBJECT lib = OBJECT dd (see exec/devices)
newminlist( list )
sf := syslist.head
Forbid()
Disable()
WHILE sf.ln.succ
NEW f
f.name := StrCopy( String( StrLen( sf.ln.name ) ) , sf.ln.name )
f.open_count := sf.opencnt
f.vernum := sf.version
f.revnum := sf.revision
AddTail( list , f )
sf := sf.ln.succ
ENDWHILE
EXCEPT DO
Enable()
Permit()
ReThrow()
ENDPROC
->/////////////////////////////////////////////////////////////////////////////
->///////////////////////////////////////////////////// PROC mix_sysfiles /////
->/////////////////////////////////////////////////////////////////////////////
PROC mix_sysfiles( list1 : PTR TO mlh , list2 : PTR TO mlh )
DEF sf1 : PTR TO sysfile , sf2: PTR TO sysfile
DEF bool = FALSE
WHILE ( ( sf1 := list1.head ) BUT sf1.succ )
Remove( sf1 )
sf2 := list2.head
WHILE sf2.succ
EXIT ( bool := StrCmp( sf1.name , sf2.name ) )
sf2 := sf2.succ
ENDWHILE
IF bool
sf2.open_count := sf2.open_count + sf1.open_count
DisposeLink( sf2.last_used )
sf2.last_used := current_date()
IF ( sf1.vernum <> sf2.vernum ) OR ( sf1.revnum <> sf2.revnum )
sf2.vernum := sf1.vernum
sf2.revnum := sf1.revnum
sf2.changed := sf2.changed + 1
DisposeLink( sf2.last_change )
sf2.last_change := current_date()
ENDIF
DisposeLink( sf1.name )
END sf1
ELSE
sf1.last_used := current_date()
sf1.last_change := current_date()
AddTail( list2 , sf1 )
ENDIF
ENDWHILE
ENDPROC
->/////////////////////////////////////////////////////////////////////////////
->//////////////////////////////////////////////////// PROC sort_sysfiles /////
->/////////////////////////////////////////////////////////////////////////////
PROC sort_sysfiles( list : PTR TO mlh )
DEF tlist : mlh , sf : PTR TO sysfile
DEF max , msf : PTR TO sysfile
newminlist( tlist )
WHILE ( ( sf := list.head ) BUT sf.succ )
max := -1
WHILE sf.succ
IF sf.open_count > max
max := sf.open_count
msf := sf
ENDIF
sf := sf.succ
ENDWHILE
Remove( msf )
AddTail( tlist , msf )
ENDWHILE
WHILE ( ( sf := tlist.head ) BUT sf.succ )
Remove( sf )
AddTail( list , sf )
ENDWHILE
ENDPROC
->/////////////////////////////////////////////////////////////////////////////
->/////////////////////////////////////////////////// PROC print_sysfiles /////
->/////////////////////////////////////////////////////////////////////////////
PROC print_sysfiles( list : PTR TO mlh , name , num_checks )
DEF sf : PTR TO sysfile
DEF formatstr[ 100 ] : STRING , lenf[ NUMBERFIELDS ] : ARRAY
DEF str1[ 20 ] : STRING , str2[ 20 ] : STRING , str3[ 20 ] : STRING
IF ( ( sf := list.head ) BUT sf.succ )
lenf[ NAME ] := 12
lenf[ OPENED ] := 6
lenf[ LASTUSED ] := 9
lenf[ VERSION ] := 7
lenf[ CHNG ] := 4
lenf[ LASTCHANGE ] := 11
WHILE sf.succ
lenf[ NAME ] := Max( lenf[ NAME ] , EstrLen( sf.name ) )
lenf[ OPENED ] := Max( lenf[ OPENED ] , EstrLen( RealF( str1 , sf.open_count!/(num_checks!) , 2 ) ) )
lenf[ LASTUSED ] := Max( lenf[ LASTUSED ] , EstrLen( sf.last_used ) )
lenf[ VERSION ] := Max( lenf[ VERSION ] , EstrLen( StringF( str1 , '\d.\d' , sf.vernum , sf.revnum ) ) )
lenf[ CHNG ] := Max( lenf[ CHNG ] , EstrLen( StringF( str1 , '\d' , sf.changed ) ) )
lenf[ LASTCHANGE ] := Max( lenf[ LASTCHANGE ] , EstrLen( sf.last_change ) )
sf := sf.succ
ENDWHILE
StringF( formatstr , '%-\d.\ds %\d.\ds %\d.\ds %\d.\ds %\d.\ds %\d.\ds\n' ,
lenf[ NAME ] , lenf[ NAME ] ,
lenf[ OPENED ] , lenf[ OPENED ] ,
lenf[ LASTUSED ] , lenf[ LASTUSED ] ,
lenf[ VERSION ] , lenf[ VERSION ] ,
lenf[ CHNG ] , lenf[ CHNG ] ,
lenf[ LASTCHANGE ] , lenf[ LASTCHANGE ] )
PrintF( '\n\c1;33;40\c' , $9B , $6D )
PrintF( formatstr , name , 'Opened' , 'Last used' , 'Version' , 'Chng' , 'Last change' )
PrintF( '\c0;31;40\c' , $9B , $6D )
sf := list.head
WHILE sf.succ
PrintF( formatstr ,
sf.name ,
RealF( str1 , sf.open_count!/(num_checks!) , 2 ) , sf.last_used ,
StringF( str2 , '\d.\d' , sf.vernum , sf.revnum ) ,
StringF( str3 , '\d' , sf.changed ) , sf.last_change )
sf := sf.succ
ENDWHILE
ENDIF
ENDPROC
->/////////////////////////////////////////////////////////////////////////////
->//////////////////////////////////////////////////// PROC save_sysfiles /////
->/////////////////////////////////////////////////////////////////////////////
PROC save_sysfiles( file , list : PTR TO mlh , type )
DEF sf : PTR TO sysfile , sl[ 200 ] : STRING
sf := list.head
WHILE sf.succ
Fputs( file ,
StringF( sl , '"\s" \d "\s" \d \d \d "\s" \s\n' ,
sf.name , sf.open_count , sf.last_used ,
sf.vernum , sf.revnum , sf.changed , sf.last_change ,
type ) )
sf := sf.succ
ENDWHILE
ENDPROC